/*
 * @Author: wuqingchun
 * @Date: 2024-04-22 08:46:50
 * @Description: 
 * @LastEditors: wuqingchun
 * @LastEditTime: 2024-05-07 10:47:18
 */
#ifndef __TEMPLATE_FUNC_H__
#define __TEMPLATE_FUNC_H__

#include <iostream>

// 支持默认值的模板函数
template<typename TARG=int, typename TRET=double>
TRET add(TARG a, TARG b)
{
    return a + b;
}

// 存在无限递归调用问题
// template<typename ...Args>
// void my_print(Args... args)
// {
//     my_print(args...);
// }


// 可变参数函数模板
// 定义无参重载函数，用于递归退出
void my_print()
{

}

// 定义一个参数的模板函数，用于递归退出
template <typename T>
void my_print(const T& refValue)
{
    std::cout << refValue << std::endl;
}

// 定义支持一个或多个参数的可变参数模板函数，支持递归调用
// 其中 Args 为模板参数包，是类型列表
// args 为函数参数包，是值列表
template<typename T, typename... Args>
void my_print(const T& refValue, Args... args)
{
    // 将函数参数包展开，对列表中的第一项进行处理，再将余下的内容传递给递归调用；以此类推，直到列表为空。
    my_print(refValue);
    my_print(args...);
}


template<typename T, typename CMPFUNC>
bool Less(T&& arg1, T&& arg2, CMPFUNC cmpFunc)
{
    int iCmp = cmpFunc(std::forward<T>(arg1), std::forward<T>(arg2));
    if (iCmp < 0)
    {
        return true;
    }

    return false;
}


int CmpInt(const int& arg1, const int& arg2)
{
    return arg1 - arg2;
}

int CmpIntPtr(int* arg1, int* arg2)
{
    return *arg1 - *arg2;
}

// 主模板
template <typename T>
T Sub(T arg1, T arg2)
{
    std::cout << "primary template" << std::endl;
    return arg1 - arg2;
}

// 全特化
template<>
int Sub(int arg1, int arg2)
{
    std::cout << "full specialization" << std::endl;
    return arg1 - arg2;
}

#endif //__TEMPLATE_FUNC_H__

